home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / text / print / VirtPrinters2.lha / screen_printer_source / transfer.asm < prev   
Assembly Source File  |  1993-11-11  |  7KB  |  242 lines

  1. **********************************************************************
  2. *
  3. * Transfer routine for Screen_Printer
  4. *
  5. **********************************************************************
  6.  
  7.         INCLUDE "exec/types.i"
  8.  
  9.         INCLUDE "intuition/intuition.i"
  10.         INCLUDE "devices/printer.i"
  11.         INCLUDE "devices/prtbase.i"
  12.         INCLUDE "devices/prtgfx.i"
  13.  
  14.         XREF    _PD
  15.  
  16.         XDEF    _Transfer
  17.  
  18.         SECTION         printer,CODE
  19. _Transfer:
  20. ; Transfer(PInfo, y, ptr)
  21. ; struct PrtInfo *PInfo         4-7
  22. ; UWORD y;                      8-11
  23. ; UBYTE *ptr;                   12-15
  24. ; UWORD colors[];               16-19
  25. ;
  26.  
  27.         movem.l d2-d6/a2-a4,-(sp)       ;save regs used
  28.  
  29.         movea.l 36(sp),a0               ;a0 = PInfo
  30.         move.l  40(sp),d0               ;d0 = y
  31.         movea.l 44(sp),a1               ;a1 = ptr
  32.         movea.l 48(sp),a2               ;a2 = colors
  33.  
  34.         moveq.l #3,d2
  35.         and.w   d0,d2                   ;d2 = y & 3
  36.         lsl.w   #2,d2                   ;d2 = (y & 3) << 2
  37.         movea.l pi_dmatrix(a0),a3       ;a3 = dmatrix
  38.         adda.l  d2,a3                   ;a3 = dmatrix + ((y & 3) << 2)
  39.  
  40.         movea.l _PD,a4
  41.         cmpi.w  #SHADE_COLOR,pd_Preferences+pf_PrintShade(a4)   ;color dump?
  42.         bne     not_color               ;no
  43.  
  44. color:
  45. ; a0 - PInfo
  46. ; a1 - ptr
  47. ; a2 - colors
  48. ; a3 - dmatrix ptr
  49. ; d0 - y
  50.  
  51.         movem.l d7/a5,-(sp)             ;save regs used
  52.  
  53.         movea.l a1,a4
  54.         movea.l a1,a5
  55.         adda.w  (a2)+,a1                ;a1 = ptr + colors[0] (yptr)
  56.         adda.w  (a2)+,a4                ;a4 = ptr + colors[1] (mptr)
  57.         adda.w  (a2)+,a5                ;a5 = ptr + colors[2] (cptr)
  58.  
  59.         movea.l pi_ColorInt(a0),a2      ;a2 = ColorInt ptr
  60.         move.w  pi_width(a0),width      ;# of pixels to do
  61.         move.w  pi_xpos(a0),d2          ;d2 = x
  62.         movea.l pi_ScaleX(a0),a0        ;a0 = ScaleX (sxptr)
  63.  
  64. ; a0 - sxptr
  65. ; a1 - yptr
  66. ; a2 - ColorInt ptr
  67. ; a3 - dmatrix ptr
  68. ; a4 - mptr
  69. ; a5 - cptr
  70. ; d0 - byte to set (x >> 3)
  71. ; d1 - sx
  72. ; d2 - x
  73. ; d3 - dvalue (dmatrix[x & 3])
  74. ; d4 - Yellow
  75. ; d5 - Magenta
  76. ; d6 - Cyan
  77. ; d7 - bit to set
  78.  
  79. cwidth_loop:
  80.         move.b  PCMYELLOW(a2),d4        ;d4 = Yellow
  81.         move.b  PCMMAGENTA(a2),d5       ;d5 = Magenta
  82.         move.b  PCMCYAN(a2),d6          ;d6 = Cyan
  83.         addq.l  #ce_SIZEOF,a2           ;advance to next entry
  84.  
  85.         move.w  (a0)+,d1                ;d1 = # of times to use this pixel (sx)
  86.         subq.w  #1,d1                   ;adjust for dbra
  87.  
  88. csx_loop:
  89.         moveq.l #3,d3
  90.         and.w   d2,d3                   ;d3 = x & 3
  91.         move.b  0(a3,d3.w),d3           ;d3 = dmatrix[x & 3]
  92.  
  93.         move.w  d2,d0
  94.         lsr.w   #3,d0                   ;compute byte to set
  95.         move.w  d2,d7
  96.         not.w   d7                      ;compute bit to set
  97.  
  98. yellow:
  99.         cmp.b   d3,d4                   ;render yellow pixel?
  100.         ble.s   magenta                 ;no.
  101.         bset.b  d7,0(a1,d0.w)           ;*(ptr + x >> 3) |= 2 ^ x
  102.  
  103. magenta:
  104.         cmp.b   d3,d5                   ;render magenta pixel?
  105.         ble.s   cyan                    ;no.
  106.         bset.b  d7,0(a4,d0.w)           ;*(ptr + x >> 3) |= 2 ^ x
  107.  
  108. cyan:
  109.         cmp.b   d3,d6                   ;render cyan pixel?
  110.         ble.s   csx_end                 ;no, skip to next pixel.
  111.         bset.b  d7,0(a5,d0.w)           ;*(ptr + x >> 3) |= 2 ^ x
  112.  
  113. csx_end
  114.         addq.w  #1,d2                   ;x++
  115.         dbra    d1,csx_loop             ;sx--
  116.         subq.w  #1,width                ;width--
  117.         bne.s   cwidth_loop
  118.         movem.l (sp)+,d7/a5             ;restore regs used
  119.         bra     exit
  120.  
  121. not_color:
  122. ; a0 - PInfo
  123. ; a1 - ptr
  124. ; a2 - colors
  125. ; a3 - dmatrix ptr
  126. ; d0 - y
  127.  
  128.     adda.w    (a2),a1            ;a1 = ptr + colors[0]
  129.         move.w  pi_width(a0),d1         ;d1 = width
  130.         subq.w  #1,d1                   ;adjust for dbra
  131.  
  132.         move.w  pi_threshold(a0),d3     ;d3 = threshold, thresholding?
  133.         beq.s   grey_scale              ;no, grey-scale
  134.  
  135. threshold:
  136. ; a0 - PInfo
  137. ; a1 - ptr
  138. ; d0 - y
  139. ; d1 - width
  140. ; d3 - threshold
  141.  
  142.         eori.b  #15,d3                  ;d3 = dvalue
  143.         movea.l pi_ColorInt(a0),a2      ;a2 = ColorInt ptr
  144.         move.w  pi_xpos(a0),d2          ;d2 = x
  145.         movea.l pi_ScaleX(a0),a0        ;a0 = ScaleX (sxptr)
  146.  
  147. ; a0 - sxptr
  148. ; a1 - ptr
  149. ; a2 - ColorInt ptr
  150. ; a3 - dmatrix ptr (NOT USED)
  151. ; d0 - byte to set (x >> 3)
  152. ; d1 - width
  153. ; d2 - x
  154. ; d3 - dvalue
  155. ; d4 - Black
  156. ; d5 - sx
  157. ; d6 - bit to set
  158.  
  159. twidth_loop:
  160.         move.b  PCMBLACK(a2),d4         ;d4 = Black
  161.         addq.l  #ce_SIZEOF,a2           ;advance to next entry
  162.  
  163.         move.w  (a0)+,d5                ;d5 = # of times to use this pixel (sx)
  164.  
  165.         cmp.b   d3,d4                   ;render this pixel?
  166.         ble.s   tsx_end                 ;no, skip to next pixel.
  167.         subq.w  #1,d5                   ;adjust for dbra
  168.  
  169. tsx_render:                             ;yes, render this pixel sx times
  170.         move.w  d2,d0
  171.         lsr.w   #3,d0                   ;compute byte to set
  172.         move.w  d2,d6
  173.         not.w   d6                      ;compute bit to set
  174.         bset.b  d6,0(a1,d0.w)           ;*(ptr + x >> 3) |= 2 ^ x
  175.  
  176.         addq.w  #1,d2                   ;x++
  177.         dbra    d5,tsx_render           ;sx--
  178.         dbra    d1,twidth_loop          ;width--
  179.         bra.s   exit                    ;all done
  180.  
  181. tsx_end:
  182.         add.w   d5,d2                   ;x += sx
  183.         dbra    d1,twidth_loop          ;width--
  184.         bra.s   exit
  185.  
  186. grey_scale:
  187. ; a0 - PInfo
  188. ; a1 - ptr
  189. ; d0 - y
  190. ; d1 - width
  191.  
  192.         movea.l pi_ColorInt(a0),a2      ;a2 = ColorInt ptr
  193.         move.w  pi_xpos(a0),d2          ;d2 = x
  194.         movea.l pi_ScaleX(a0),a0        ;a0 = ScaleX (sxptr)
  195.  
  196. ; a0 - sxptr
  197. ; a1 - ptr
  198. ; a2 - ColorInt ptr
  199. ; a3 - dmatrix ptr
  200. ; d0 - byte to set (x >> 3)
  201. ; d1 - width
  202. ; d2 - x
  203. ; d3 - dvalue (dmatrix[x & 3])
  204. ; d4 - Black
  205. ; d5 - sx
  206. ; d6 - bit to set
  207.  
  208. gwidth_loop:
  209.         move.b  PCMBLACK(a2),d4         ;d4 = Black
  210.         addq.l  #ce_SIZEOF,a2           ;advance to next entry
  211.  
  212.         move.w  (a0)+,d5                ;d5 = # of times to use this pixel (sx)
  213.         subq.w  #1,d5                   ;adjust for dbra
  214.  
  215. gsx_loop:
  216.         moveq.l #3,d3
  217.         and.w   d2,d3                   ;d3 = x & 3
  218.         move.b  0(a3,d3.w),d3           ;d3 = dmatrix[x & 3]
  219.  
  220.         cmp.b   d3,d4                   ;render this pixel?
  221.         ble.s   gsx_end                 ;no, skip to next pixel.
  222.  
  223.         move.w  d2,d0
  224.         lsr.w   #3,d0                   ;compute byte to set
  225.         move.w  d2,d6
  226.         not.w   d6                      ;compute bit to set
  227.         bset.b  d6,0(a1,d0.w)           ;*(ptr + x >> 3) |= 2 ^ x
  228.  
  229. gsx_end
  230.         addq.w  #1,d2                   ;x++
  231.         dbra    d5,gsx_loop             ;sx--
  232.         dbra    d1,gwidth_loop          ;width--
  233.  
  234. exit:
  235.         movem.l (sp)+,d2-d6/a2-a4       ;restore regs used
  236.         moveq.l #0,d0                   ;flag all ok
  237.         rts                             ;goodbye
  238.  
  239. width   dc.w    0
  240.  
  241.         END
  242.